home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / LIB / GETINITD.C < prev    next >
C/C++ Source or Header  |  1996-03-25  |  7KB  |  248 lines

  1. /* ============ */
  2. /* getinitd.c    */
  3. /* ============ */
  4. #include <defcodes.h>
  5. #include <math.h>
  6. #include <time.h>
  7. #include <miscdefs.h>
  8. #
  9. #define FULL_SIZE ((unsigned)RAND_MAX + 1U)
  10.  
  11. /* the seed */
  12. #define    ANSI_BASE_SEED    161803398
  13. unsigned long _Randseed = ANSI_BASE_SEED;
  14.  
  15. /* -------------------------------------------- */
  16. /* ANSI_rand - From Plauger, Standard C Library */
  17. /* -------------------------------------------- */
  18. static
  19. int    (ANSI_rand) (void)
  20. {                    /* ANSI Random Numbers */
  21.     /* ANSI-Specified Generator */
  22.     _Randseed = _Randseed * 1103515245 + 12345;
  23.     return ((unsigned int) (_Randseed >> 16) & RAND_MAX);
  24. }
  25. /* -------------------------------------- */
  26. /* Comb_rand - Jerry Dwyer, CUJ June 1995 */
  27. /* -------------------------------------- */
  28. static
  29. int    (Comb_rand) (void)
  30. {
  31.     return ((int)(rand_comb() >> 12) & RAND_MAX);
  32. }
  33. /* ------------------------------------------- */
  34. /* DEK_rand - From Knuth vol 2, p 102, line 26 */
  35. /* ------------------------------------------- */
  36. static
  37. int    (DEK_rand) (void)
  38. {                    /* Knuth Random Numbers */
  39.     /* Knuth Generator */
  40.     _Randseed = _Randseed * 1664525 + 1;
  41.     return ((unsigned int) ((_Randseed >> 12) & RAND_MAX));
  42. }
  43. /* ------------------------------------------ */
  44. /* Fib_rand - Fibonacci Sequence, Knuth p. 26 */
  45. /* ------------------------------------------ */
  46. static
  47. int    (Fib_rand) (void)
  48. {
  49.     static  unsigned long  OlderSeed;
  50.     static  unsigned long  OldSeed = (ANSI_BASE_SEED*3)/2;
  51.     OlderSeed = OldSeed;
  52.     OldSeed   = _Randseed;
  53.     _Randseed += OlderSeed;
  54.     return ((unsigned int) (_Randseed >> 8 & RAND_MAX));
  55. }
  56. /* ------------------------------------------ */
  57. /* Hi_rand - From Knuth vol 2, p 102, line 27 */
  58. /* ------------------------------------------ */
  59. static
  60. int    (Hi_rand) (void)
  61. {
  62.     long double RandProd;
  63.     RandProd = (double)_Randseed * 314159269. + 1;
  64.     _Randseed = (unsigned long) fmodl(RandProd, 2147483647.);
  65.     return ((unsigned int) (_Randseed >> 8 & RAND_MAX));
  66. }
  67. /* -------------------------------------- */
  68. /* Port_rand - Jerry Dwyer, CUJ June 1995 */
  69. /* -------------------------------------- */
  70. static
  71. int    (Port_rand) (void)
  72. {
  73.     return ((int)(rand_port() >> 12) & RAND_MAX);
  74. }
  75. /* ------------------------------------------- */
  76. /* R250_rand - Linear Shift Register Generator */
  77. /* ------------------------------------------- */
  78. static
  79. int    (R250_rand) (void)
  80. {
  81.     return ((int)(dRand250() * (double)FULL_SIZE) & RAND_MAX);
  82. }
  83. /* --------------------------------------------- */
  84. /* Randu - Classic Lousy Generator, Knuth p. 104 */
  85. /* --------------------------------------------- */
  86. static
  87. int    (Randu) (void)
  88. {
  89.     _Randseed = (_Randseed * 65539L) % (long)(1L << 31);
  90.     return ((unsigned int) ((_Randseed >> 8) & RAND_MAX));
  91. }
  92. /* ------------------------------------ */
  93. /* SLM_rand - Steve Moshier's Generator */
  94. /* ------------------------------------ */
  95. static
  96. int    (SLM_rand) (void)
  97. {
  98.     int     RandSTD;
  99.     double  RandSLM;
  100.  
  101.     drand(&RandSLM);            /* Returns variate in [1,2) */
  102.  
  103.     RandSTD =
  104.     (int)(RandSLM * (double)FULL_SIZE - (double)FULL_SIZE);
  105.     return (RandSTD & RAND_MAX);
  106. }
  107. /* -------------------------------------- */
  108. /* SUB_rand - Knuth Subtractive Generator */
  109. /* -------------------------------------- */
  110. static
  111. int    (SUB_rand) (void)
  112. {
  113.     return (Irand55((long *)&_Randseed));
  114. }
  115. #include <qrmrand.c>
  116. #define    CASE_A    "ANSI_rand() (PJP)"
  117. #define    CASE_C    "Dwyer Combination (CUJ 6/95)"
  118. #define    CASE_F    "Math77 (Fortran)"
  119. #define    CASE_G    "Marsaglia-Zaman-Tsang Ranmar"
  120. #define    CASE_H    "Knuth Line 27"
  121. #define    CASE_I    "Fibonacci Sequence (Knuth p. 26)"
  122. #define    CASE_J    "Marsaglia-Zaman-James VLP"
  123. #define    CASE_K    "Knuth Line 26"
  124. #define    CASE_L    "Linear Shift Register"
  125. #define    CASE_M    "Moshier drand()"
  126. #define    CASE_P    "Dwyer Portable (CUJ 6/95)"
  127. #define    CASE_R    "Run-Time Lib rand()"
  128. #define    CASE_S    "Knuth Subtractive"
  129. #define    CASE_U    "Original Randu (Knuth p. 104)"
  130. #define    CASE_4    "Approximate-Factoring Algorithm # 4"
  131.  
  132. /* ==================================================================== */
  133. /* GetInitialData - Returns initial input parameters for test functions    */
  134. /* ==================================================================== */
  135. void
  136. GetInitialData(INIT_DATA_STRU  *InitialData)
  137. {
  138.     char    RandSpec = 0;
  139.  
  140.     GetInt("Enter Starting Seed (-1 for time): ",
  141.     (int *)&InitialData->SeedSrce);
  142.     fprintf(stderr, "\n");
  143.     GetChr("Enter Generator Desired:"
  144.     "\n\tA = "CASE_A
  145.     "\n\tC = "CASE_C
  146.     "\n\tF = "CASE_F
  147.     "\n\tG = "CASE_G
  148.     "\n\tH = "CASE_H
  149.     "\n\tI = "CASE_I
  150.     "\n\tJ = "CASE_J
  151.     "\n\tK = "CASE_K
  152.     "\n\tL = "CASE_L
  153.     "\n\tM = "CASE_M
  154.     "\n\tP = "CASE_P
  155.     "\n\tR = "CASE_R
  156.     "\n\tS = "CASE_S
  157.     "\n\tU = "CASE_U
  158.     "\n\t4 = "CASE_4
  159.     "\n\tElse (None of the Above) "CASE_R": ",
  160.         &RandSpec);
  161.  
  162.     if (InitialData->SeedSrce == (UINT)(-1))
  163.     {
  164.     time_t    MyTime = time(NULL);
  165.     InitialData->UserSeed = (UINT)MyTime;
  166.     }
  167.     else
  168.     {
  169.     InitialData->UserSeed = InitialData->SeedSrce;
  170.     }
  171.  
  172.     _Randseed += InitialData->UserSeed;
  173.  
  174.     switch (toupper(RandSpec))
  175.     {
  176.     case 'A':                            /* ANSI_rand() (PJP) */
  177.     InitialData->RandFun = ANSI_rand;
  178.     InitialData->GenName = CASE_A;
  179.     break;
  180.     case 'C':
  181.     InitialData->RandFun = Comb_rand;
  182.     InitialData->GenName = CASE_C;
  183.     init_rand_comb((long)InitialData->UserSeed,
  184.         (long)InitialData->UserSeed);
  185.     break;
  186.     case 'F':
  187.     InitialData->RandFun = iM77_rand;
  188.     InitialData->GenName = CASE_F;
  189.     M77_rand_init(InitialData->UserSeed);
  190.     break;
  191.     case 'G':
  192.     InitialData->RandFun = Iranmar;
  193.     InitialData->GenName = CASE_G;
  194.     rmarin(InitialData->UserSeed, InitialData->UserSeed);
  195.     break;
  196.     case 'H':
  197.     InitialData->RandFun = Hi_rand;
  198.     InitialData->GenName = CASE_H;
  199.     break;
  200.     case 'I':
  201.     InitialData->RandFun = Fib_rand;
  202.     InitialData->GenName = CASE_I;
  203.     break;
  204.     case 'J':
  205.     InitialData->RandFun = IRand_MZ;
  206.     InitialData->GenName = CASE_J;
  207.     Rand_MZ_Init(_Randseed);
  208.     break;
  209.     case 'K':
  210.     InitialData->RandFun = DEK_rand;
  211.     InitialData->GenName = CASE_K;
  212.     break;
  213.     case 'L':
  214.     InitialData->RandFun = R250_rand;
  215.     InitialData->GenName = CASE_L;
  216.     Rand250_init(InitialData->UserSeed);
  217.     break;
  218.     case 'M':
  219.     InitialData->RandFun = SLM_rand;
  220.     InitialData->GenName = CASE_M;
  221.     DrandSeed(InitialData->UserSeed);    /* Initialize Generator */
  222.     break;
  223.     case 'P':
  224.     InitialData->RandFun = Port_rand;
  225.     InitialData->GenName = CASE_P;
  226.     init_rand_port(InitialData->UserSeed);
  227.     break;
  228.     default:
  229.     case 'R':
  230.     srand(InitialData->UserSeed);        /* Initialize Generator */
  231.     InitialData->RandFun = rand;
  232.     InitialData->GenName = CASE_R;
  233.     break;
  234.     case 'S':
  235.     InitialData->RandFun = SUB_rand;
  236.     InitialData->GenName = CASE_S;
  237.     break;
  238.     case 'U':
  239.     InitialData->RandFun = Randu;
  240.     InitialData->GenName = CASE_U;
  241.     break;
  242.     case '4':
  243.     InitialData->RandFun = Qrm4_rand;
  244.     InitialData->GenName = CASE_4;
  245.     break;
  246.     }
  247. }
  248.